package com.forward.uploadapp.util;

import com.forward.uploadapp.entity.AppInfo;

import java.io.File;
import java.util.List;
import java.util.Map;

import cn.bmob.v3.BmobBatch;
import cn.bmob.v3.BmobObject;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.datatype.BatchResult;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.listener.DeleteBatchListener;
import cn.bmob.v3.listener.DownloadFileListener;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.QueryListListener;
import cn.bmob.v3.listener.QueryListener;
import cn.bmob.v3.listener.SaveListener;
import cn.bmob.v3.listener.UpdateListener;
import cn.bmob.v3.listener.UploadBatchListener;
import cn.bmob.v3.listener.UploadFileListener;

/**
 * Created by forward on 2017/12/24.
 */
public class BmobUtils {

    /**
     * 添加一条数据
     *
     * @param object
     * @param listener
     */
    public static void addData(BmobObject object, SaveListener<String> listener) {
        object.save(listener);
    }

    /**
     * 删除一条数据
     *
     * @param object
     * @param listener
     */
    public static void deleteData(BmobObject object, UpdateListener listener) {
        object.delete(object.getObjectId(), listener);
    }

    /**
     * 更新一条数据
     *
     * @param object
     * @param listener
     */
    public static void updateData(AppInfo object, UpdateListener listener) {
        object.update(object.getObjectId(), listener);
    }

    /**
     * 按指定要求查询单条数据
     *
     * @param objectId
     * @param listener
     */
    public static void queryAppInfoData(String objectId, QueryListener<AppInfo> listener) {
        new BmobQuery<AppInfo>().getObject(objectId, listener);
    }

    /**
     * 按指定要求查询多条数据
     *
     * @param packageName
     * @param listener
     */
    public static void queryDatasByPackageName(String packageName, FindListener<AppInfo> listener) {
        BmobQuery<AppInfo> bmobQuery = new BmobQuery<>();
       if (packageName != null){
           bmobQuery.addWhereEqualTo("packageName",packageName).setLimit(50).findObjects(listener);
       }
    }

    /**
     * 按指定要求查询多条数据
     *
     * @param params
     * @param limit
     * @param listener
     */
    public static void queryAppInfoDatas(Map<String, String> params,
                                         int limit, FindListener<AppInfo> listener) {
        BmobQuery<AppInfo> bmobQuery = new BmobQuery<>();
        if (params != null) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                bmobQuery.addWhereEqualTo(entry.getKey(), entry.getValue());
            }
        }
        if (limit == -1) {
            bmobQuery.setLimit(limit);
        }
        bmobQuery.findObjects(listener);
    }

    /**
     * 查询AppInfo表中所有的数据
     *
     * @param listener
     */
    public static void queryAllAppInfoData(FindListener<AppInfo> listener) {
        new BmobQuery<AppInfo>().order("updateAt").findObjects(listener);
    }

    /**
     * 批量添加数据
     *
     * @param objects
     * @param listListener
     */
    public static void addDatas(List<? extends BmobObject> objects, QueryListListener<BatchResult> listListener) {
        int size = objects.size();
        if (size > 50) {
            for (int i = 0; i < size / 50 + 1; i++) {
                new BmobBatch().insertBatch((List<BmobObject>)
                        objects.subList(50 * i, Math.min(size, 50 * (i + 1)))).doBatch(listListener);
            }
        } else {
            new BmobBatch().insertBatch((List<BmobObject>) objects).doBatch(listListener);
        }
    }

    /**
     * 批量更新数据
     *
     * @param objects
     * @param listListener
     */
    public static void updataDatas(List<? extends BmobObject> objects, QueryListListener<BatchResult> listListener) {
        new BmobBatch().updateBatch((List<BmobObject>) objects).doBatch(listListener);
    }

    /**
     * 批量删除数据
     *
     * @param objects
     * @param listListener
     */
    public static void deleteDatas(List<BmobObject> objects, QueryListListener<BatchResult> listListener) {
        new BmobBatch().deleteBatch(objects).doBatch(listListener);
    }

    /**
     * 添加多种类型的数据
     *
     * @param addDatas
     * @param deleteDatas
     * @param updateDatas
     * @param listListener
     */
    public static void moreOperateDatas(List<BmobObject> addDatas, List<BmobObject> deleteDatas,
                                        List<BmobObject> updateDatas,
                                        QueryListListener<BatchResult> listListener) {
        BmobBatch bmobBatch = new BmobBatch();
        if (addDatas != null) {
            bmobBatch.insertBatch(addDatas);
        }
        if (deleteDatas != null) {
            bmobBatch.deleteBatch(deleteDatas);
        }
        if (updateDatas != null) {
            bmobBatch.updateBatch(deleteDatas);
        }
        bmobBatch.doBatch(listListener);
    }

    /**
     * 上传文件
     *
     * @param file
     * @param listener
     */
    public static void uploadFile(File file, UploadFileListener listener) {
        if (file != null && file.exists()) {
            new BmobFile(file).upload(listener);
        }
    }

    /**
     * 批量上传文件
     *
     * @param filePaths
     * @param listener
     */
    public static void uploadFiles(List<String> filePaths, UploadBatchListener listener) {
        if (filePaths != null) {
            uploadFiles((String[]) filePaths.toArray(), listener);
        }
    }

    /**
     * 批量上传文件
     *
     * @param filePaths
     * @param listener
     */
    public static void uploadFiles(String[] filePaths, UploadBatchListener listener) {
        BmobFile.uploadBatch(filePaths, listener);
    }

    /**
     * 下载文件
     *
     * @param fileName
     * @param url
     * @param saveFile
     * @param listener
     */
    public static void downloadFile(String fileName,
                                    String url, File saveFile, DownloadFileListener listener) {
        new BmobFile(fileName, "", url).download(saveFile, listener);
    }

    /**
     * 删除文件
     *
     * @param url      上传文件成功之后通过bmobFile.getUrl()方法获得的
     * @param listener
     */
    public static void deleteFile(String url, UpdateListener listener) {
        BmobFile bmobFile = new BmobFile();
        bmobFile.setUrl(url);
        bmobFile.delete(listener);
    }

    /**
     * 批量删除文件
     *
     * @param urls     此url必须是上传文件成功之后通过bmobFile.getUrl()方法获取的
     * @param listener
     */
    public static void deleteFiles(String[] urls, DeleteBatchListener listener) {
        BmobFile.deleteBatch(urls, listener);
    }
}